package reflect;

import reflect.annotation.AutoRunClass;
import reflect.annotation.AutoRunMethod;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URISyntaxException;

public class test4 {
    public static void main(String[] args) throws Exception {
        File dir = new File(
          test4.class.getResource(".").toURI()
        );  //获取test4类所在的目录路径
        String packageName = test4.class.getPackage().getName();    //获取当前类的包路径
        File[] files = dir.
                listFiles(f -> f.getName().endsWith(".class"));  //筛选出test4所在目录下的所有以.class结尾的文件
        for(File f:files){  //遍历筛选好的File数组
            String className = f.getName().substring(0,f.getName().indexOf("."));   //获取当前f的文件名，不包含后缀
            Class cls = Class.forName(packageName+"."+className);   //拼接包路径
            if(cls.isAnnotationPresent(AutoRunClass.class)){    //判断cls表示的类对象是否被AutoRunCLass这个注解标注了
                Object o = cls.newInstance();   //穿件cls的实例对象
                Method[] allMethod = cls.getDeclaredMethods();  //获取cls类对象中的所有方法
                for(Method m:allMethod){    //遍历cls类中的所有方法
                    if(m.isAnnotationPresent(AutoRunMethod.class)){ //判断当前方法是否被@AutoRunMethod注解标注
                        System.out.println(cls.getSimpleName()
                                +"类中,被注解的方法"+m.getName());
                        AutoRunMethod annotation = m.getAnnotation(AutoRunMethod.class);    //获取被@AutoRunMethod注解的实例
                        int len = annotation.value();   //获取注解实例中属性的值
                        System.out.println("注解上标注需要循环:"+len+"次");
                        for(int i=1;i<=len;i++){
                            m.invoke(o);    //循环执行方法
                        }
                    }
                }
            }
        }
    }
}
